package com.ruoyi.web.support;

import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SupSupplier;
import com.ruoyi.system.service.ISupSupplierService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Optional;

/**
 * 辅助解析当前登录用户对应的供应商编码。
 * 优先从用户备注（remark）读取供应商编码；
 * 若无，则按用户昵称或账号精确匹配供应商名称，取首个匹配的供应商编码。
 */
@Component
public class SupplierContext {

    @Autowired
    private ISupSupplierService supplierService;

    /**
     * 解析当前登录用户的供应商编码（仅当用户角色包含 supplier 时）。
     * @return Optional 包含供应商编码；若非供应商角色或无法解析则为空
     */
    public Optional<String> resolveCurrentSupplierCode() {
        // 超级管理员或拥有 admin 角色的用户，跳过过滤
        try {
            Long uid = SecurityUtils.getUserId();
            if (SysUser.isAdmin(uid) || SecurityUtils.hasRole("admin")) {
                return Optional.empty();
            }
        } catch (Exception ignored) {
            // 安全获取失败则继续判断角色
        }

        if (!SecurityUtils.hasRole("supplier")) {
            return Optional.empty();
        }

        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (loginUser == null || loginUser.getUser() == null) {
            return Optional.empty();
        }

        SysUser user = loginUser.getUser();

        // 1) 优先从备注取编码
        String remarkCode = user.getRemark();
        if (StringUtils.hasText(remarkCode)) {
            return Optional.of(remarkCode.trim());
        }

        // 2) 尝试用昵称匹配供应商名称
        String nickName = user.getNickName();
        String userName = user.getUserName();

        String code = findSupplierCodeByNameStrict(nickName);
        if (!StringUtils.hasText(code)) {
            code = findSupplierCodeByNameStrict(userName);
        }

        return StringUtils.hasText(code) ? Optional.of(code) : Optional.empty();
    }

    /**
     * 通过供应商名称精确匹配，找到供应商编码。
     */
    private String findSupplierCodeByNameStrict(String supplierName) {
        if (!StringUtils.hasText(supplierName)) {
            return null;
        }
        SupSupplier query = new SupSupplier();
        // Mapper 对名称使用 like 检索，这里为尽量精确，仍传入完整名称
        query.setSupplierName(supplierName.trim());
        List<SupSupplier> list = supplierService.selectSupSupplierList(query);
        if (list == null || list.isEmpty()) {
            return null;
        }
        // 取第一条匹配的记录
        SupSupplier first = list.get(0);
        return first.getSupplierCode();
    }
}